"""
提示词配置文件

包含所有用于引导模型调用的prompt和few-shot示例
"""

# =============================================================================
# 统一的Few-shot示例定义
# =============================================================================

COMMON_EXAMPLES = [
    {
        "input": {
            "file_path": "docs/networking.md",
            "remove_content": "modprobe br_netfilte",
            "add_content": "modprobe br_netfilter",
            "context_before": "To enable bridge netfilter, run:",
            "context_after": "This will allow iptables to filter bridged traffic."
        },
        "evaluation_output": {
            "is_good_change": True,
            "reason": "修正了内核模块名拼写错误，从 br_netfilte 改为 br_netfilter。该改动直接影响模块加载命令的执行结果，属于高价值的技术文档改进。",
            "improvement_type": "拼写修正",
            "score": 5
        },

    }
]

# =============================================================================
# 提示词模板
# =============================================================================

def create_evaluation_prompt(sample, examples):
    """创建评估提示词
    
    Args:
        sample: 待评估样本(dict)
        examples: few-shot示例列表(List[Dict])，每个示例字段尽量包含
                  file_path/remove_content/add_content/context_before/context_after，
                  可选 evaluation 字段用于展示标签说明

    Returns:
        拼装完成的prompt字符串
    """
    examples_text = ""
    for i, ex in enumerate(examples):
        # 构建完整的原始文档
        context_before = ex.get('context_before', '').strip()
        remove_content = ex.get('remove_content', '').strip()
        add_content = ex.get('add_content', '').strip()
        context_after = ex.get('context_after', '').strip()
        
        # 完整的原始文档
        original_doc = ""
        if context_before:
            original_doc += f"{context_before}\n"
        if remove_content:
            original_doc += f"{remove_content}\n"
        if context_after:
            original_doc += f"{context_after}\n"
        
        # 修改后的文档
        modified_doc = ""
        if context_before:
            modified_doc += f"{context_before}\n"
        if add_content:
            modified_doc += f"{add_content}\n"
        if context_after:
            modified_doc += f"{context_after}\n"
        
        examples_text += f"""
【示例 {i+1}】
文件: {ex.get('file_path','')}

【原始文档】
{original_doc}

【修改说明】
将 "{remove_content}" 替换为 "{add_content}"

【修改后文档】
{modified_doc}

"""

    header = "你是一位专业的技术文档编辑评估专家。\n\n"
    if examples:
        header += f"""【学习示例】
以下是{len(examples)}个高质量文档修改的参考示例。这些示例都是经过筛选的优秀修改案例，代表了良好的文档编辑实践。请仔细学习这些示例的特点和改进方式，作为评估标准的参考：

{examples_text}

【重要说明】
- 请以这些示例的质量水平作为评估基准
- 类似质量的修改应该给予高分（4-5分）和 is_valid: true

"""

    # 为当前任务也构建相同的格式
    sample_context_before = sample.get('context_before', '').strip()
    sample_remove_content = sample.get('remove_content', '').strip()
    sample_add_content = sample.get('add_content', '').strip()
    sample_context_after = sample.get('context_after', '').strip()
    
    # 完整的原始文档
    sample_original_doc = ""
    if sample_context_before:
        sample_original_doc += f"{sample_context_before}\n"
    if sample_remove_content:
        sample_original_doc += f"{sample_remove_content}\n"
    if sample_context_after:
        sample_original_doc += f"{sample_context_after}\n"
    
    # 修改后的文档
    sample_modified_doc = ""
    if sample_context_before:
        sample_modified_doc += f"{sample_context_before}\n"
    if sample_add_content:
        sample_modified_doc += f"{sample_add_content}\n"
    if sample_context_after:
        sample_modified_doc += f"{sample_context_after}\n"

    prompt = header + f"""【评分标准】
请根据以下评分细则对文档修改进行评估：
- 0分：修改完全无效，没有改进或反而变差
- 1分：修改基本无效，改进微乎其微
- 2分：修改有一定效果，但改进有限
- 3分：修改有效，有明显改进
- 4分：修改很有效，改进显著
- 5分：修改非常有效，改进突出且具有普适性

【当前任务】
现在请评估以下变更:

文件: {sample.get('file_path','')}

【原始文档】
{sample_original_doc}

【修改说明】
- 修改位置: 将 "{sample_remove_content}" 替换为 "{sample_add_content}"
- 修改类型: {'替换' if sample_remove_content and sample_add_content else '删除' if sample_remove_content else '添加'}

【修改后文档】
{sample_modified_doc}

请按照以下JSON格式输出评估结果:
{{
    "is_valid": true/false,
    "valid_reason": "详细说明为什么这是一个有效/无效的修改",
    "score": 0-5的评分,
    "score_details": "详细说明为什么给出这个分数，结合评分标准解释评分理由"
}}

请根据示例的评估标准和上述评分细则，判断这个修改是否有效，并给出相应的评分和详细理由。"""
    return prompt




# =============================================================================
# 其他模块的提示词构造
# =============================================================================

def create_prelabel_prompt(data, document_edit_labels):
    """为预标签器创建提示词。

    Args:
        data: 单条PR样本数据(dict)
        document_edit_labels: 文档编辑标签定义列表(List[Dict])

    Returns:
        prompt字符串
    """
    import json as _json

    # 构建更清晰的文档结构展示
    context_before = data.get('context_before', '').strip()
    remove_content = data.get('remove_content', '').strip()
    add_content = data.get('add_content', '').strip()
    context_after = data.get('context_after', '').strip()
    
    # 完整的原始文档
    original_doc = ""
    if context_before:
        original_doc += f"{context_before}\n"
    if remove_content:
        original_doc += f"{remove_content}\n"
    if context_after:
        original_doc += f"{context_after}\n"
    
    # 修改后的文档
    modified_doc = ""
    if context_before:
        modified_doc += f"{context_before}\n"
    if add_content:
        modified_doc += f"{add_content}\n"
    if context_after:
        modified_doc += f"{context_after}\n"

    prompt = f"""你是一名专业的技术文档编辑评审员，请分析以下PR修改，判断这次的修改属于哪种文档编辑问题类型。
【可选标签类型】
{_json.dumps(document_edit_labels, ensure_ascii=False, indent=2)}

【原始文档】
{original_doc}

【修改说明】
- 修改位置: 将 "{remove_content}" 替换为 "{add_content}"
- 修改类型: {'替换' if remove_content and add_content else '删除' if remove_content else '添加'}

【修改后文档】
{modified_doc}

【判断要求】
请仔细分析这个修改，考虑以下方面：
1. 是否涉及标点符号、空格、格式等规范性问题？
2. 是否涉及拼写、语法、术语等准确性问题？
3. 是否涉及链接、引用、代码等完整性问题？
4. 是否涉及结构、组织、一致性等整体性问题？

【输出格式】
请严格按照以下JSON格式输出，不要添加任何其他内容：

如果属于某个标签类型：
{{
    "label_id": 标签ID,
    "label_name": "标签名称",
    "reason": "选择该标签的详细理由"
}}

如果不属于任何标签类型：
{{
    "label_id": -1,
    "label_name": "不属于任何标签类型",
    "reason": "详细说明为什么不属于任何标签类型"
}}

注意：请尽量将修改归类到最接近的标签类型，即使不是完全匹配。只有在确实无法归类时才使用-1。"""
    return prompt


def create_label_examples_prompt(label_id, examples, count):
    """生成标签示例的提示词（few-shot 示例清单）。

    Args:
        label_id: 目标标签ID
        examples: few-shot示例列表
        count: 期望展示数量（仅用于文案提示）

    Returns:
        prompt字符串
    """
    prompt = f"""以下是{count}个关于标签{label_id}的示例，请参考这些示例来分析新的PR修改：

"""

    for i, example in enumerate(examples, 1):
        prompt += f"""示例{i}：
修改内容: {example.get('add_content', 'N/A')}
删除内容: {example.get('remove_content', 'N/A')}
上下文: {example.get('context_before', 'N/A')} ... {example.get('context_after', 'N/A')}
标签: {example.get('evaluation', {}).get('label_name', 'N/A')}
标签原因: {example.get('evaluation', {}).get('label_reason', 'N/A')}

"""

    prompt += """请参考上述示例，分析新的PR修改是否属于相同的标签类型。"""

    return prompt
